package mt;

import java.util.*;

/**
 * @author zhangmin
 * @create 2022-03-16 19:52
 *
 * 小美是美团的一名鲜花快递员，鲜花是一种保质期非常短的商品，所以需要尽快送到客户手中，公司对于骑手的一个要求就是要规划送花的线路，使得骑手送完所有订单走的路程尽可能少。
 * (骑手开始派送时带走了所有需要派送的花，不必每单后返回花店，路程结算是从花店出发，到送完最后一名客户为止，不计算从最后一名客户家回到花店的时间)
 * 公司对于骑手的绩效评价是取决于两个指标，一是从花店到所有客户地址的距离之和，另一个是骑手实际走的路程。
 * 设花店始终位于1号位置，客户共有n-1个，其编号为2~n。令dis(i,j)表示i号位置到j号位置的距离，即分别计算, 和骑手实际所走的最短路程。
 * 为了简化问题，我们约束这n个位置构成的是一棵树，即只有n-1条边在其中互相连接，且保证n个点彼此连通。
 */
public class meituan2021_1_1 {
    int getdisTwo(Map<Integer,int[]> dis,int end){
        int res=dis.get(end)[1];
        while (dis.get(end)[0]!=1){
            end=dis.get(end)[0];
            res+=dis.get(end)[1];
        }
        return  res;
    }

    int getDis1(Map<Integer,int[]> dis,int n){
        //从1到所有节点的路径和
        int res=0;
        for (int i = 2; i <= n; i++) {
            res+=getdisTwo(dis,i);
        }
        return res;
    }

    int getDis2(Map<Integer,int[]> dis,int n){
        //max记录从1到达的最远的距离
        int max=0;
        for (int i = 2; i <= n; i++) {
            max=Math.max(getdisTwo(dis,i),max);
        }
        //sum记录所有路径的和
        int sum=0;
        for (Map.Entry<Integer,int[]> entry:dis.entrySet()) {
            sum+=entry.getValue()[1];
        }
        //最终结果是所有路径的和的2倍（每次都会往返于根节点）-最远的一条路径的长度（最后一次不需要回去了）
        return sum*2-max;
    }

    public static void main(String[] args) {
        meituan2021_1_1 obj=new meituan2021_1_1();
        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        //存放  目的：【源，距离】
        Map<Integer,int[]> dis=new HashMap<>();
        for(int i=0;i<n-1;i++){
            int u=cin.nextInt();
            int v=cin.nextInt();
            int w=cin.nextInt();
            dis.put(v,new int[]{u,w});
        }
        int res1=obj.getDis1(dis,n);
        int res2=obj.getDis2(dis,n);
        System.out.println(res1+" "+res2);
    }


}
